/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tida.servir.pages;

import com.tida.servir.base.GeneralPage;
import com.tida.servir.components.Envelope;
import com.tida.servir.entities.ConfiguracionAcceso;
import com.tida.servir.entities.DatoAuxiliar;
import com.tida.servir.entities.Entidad;
import com.tida.servir.entities.Funcionario;
import com.tida.servir.entities.LkBusquedaEntidad;
import com.tida.servir.entities.LkBusquedaFuncionario;
import com.tida.servir.entities.LkBusquedaSancion;
import com.tida.servir.entities.LkBusquedaTrabajadorAuto;
import com.tida.servir.entities.LkBusquedaTrabajadorSan;
import com.tida.servir.entities.LkCausaSancion;
import com.tida.servir.entities.LkCausaTipoSancion;
import com.tida.servir.entities.LkConsultaPeriodo;
import com.tida.servir.entities.LkPerfilUsuarioAccesoSanciones;
import com.tida.servir.entities.LkSumaFecha;
import com.tida.servir.entities.LkTipoSancionRegLab;
import com.tida.servir.entities.Persona_Sancion;
import com.tida.servir.entities.Sancion;
import com.tida.servir.entities.Suspension;
import com.tida.servir.entities.TipoSancion;
import com.tida.servir.entities.Usuario;
import com.tida.servir.entities.UsuarioAcceso;
import com.tida.servir.services.GenericSelectModel;
import helpers.Encriptacion;
import helpers.Helpers;
import helpers.Logger;
import helpers.PDFStreamResponse;
import helpers.ServicioReniec;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Blob;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.design.JasperDesign;
import net.sf.jasperreports.engine.xml.JRXmlLoader;
import org.apache.tapestry5.Asset;
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.StreamResponse;
import org.apache.tapestry5.ajax.MultiZoneUpdate;
import org.apache.tapestry5.annotations.Component;
import org.apache.tapestry5.annotations.InjectComponent;
import org.apache.tapestry5.annotations.Log;
import org.apache.tapestry5.annotations.PageActivationContext;
import org.apache.tapestry5.annotations.Path;
import org.apache.tapestry5.annotations.Persist;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.annotations.SessionState;
import org.apache.tapestry5.corelib.components.Form;
import org.apache.tapestry5.corelib.components.TextField;
import org.apache.tapestry5.corelib.components.Zone;
import org.apache.tapestry5.hibernate.annotations.CommitAfter;
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.PropertyAccess;
import org.apache.tapestry5.services.FieldValidatorSource;
import org.apache.tapestry5.services.PageRenderLinkSource;
import org.apache.tapestry5.services.Request;
import org.apache.tapestry5.services.Response;
import org.apache.tapestry5.upload.services.UploadedFile;
import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

/**
 *
 * @author ale
 */
public class ABMSancion extends GeneralPage {

    @Property
    @SessionState
    private Entidad eue;
    @Property
    @SessionState
    private Usuario usuario;
    @Inject
    private Request _request;
    @Inject
    private ComponentResources _resources;
    @Inject
    private Session session;
    @Inject
    private PropertyAccess _access;
    @InjectComponent
    private Envelope envelope;
    @Component(id = "formsancion")
    private Form formsancion;
    @Component(id = "formvalidacion")
    private Form formvalidacion;
    @Property
    @Persist
    private String bdenoentidad;
    @Property
    @Persist
    private String bnomtrabajador;
    @Property
    @Persist
    private LkBusquedaEntidad rowentidad;
    @Property
    @Persist
    private LkBusquedaTrabajadorSan btrabajador;
    @Property
    @Persist
    private LkBusquedaFuncionario bfuncionario;
    @Property
    @Persist
    private Funcionario funcionario;
    @Property
    @Persist
    private String bnomtrabaautoridad;
    @Property
    @Persist
    private LkBusquedaTrabajadorAuto btrabajadorauto;
    //campos de datos del sancionado
    @Property
    @Persist
    private boolean bestrabajador;
    @Property
    @Persist
    private boolean bcargo;
    @Property
    @Persist
    private boolean bmostrarauto;
    @Property
    @Persist
    private boolean editasancion;
    @Property
    @Persist
    private DatoAuxiliar bdocidentidad;
    @Property
    @Persist
    private String bentidad;
    @Property
    @Persist
    private String bpuesto;
    @Property
    @Persist
    private DatoAuxiliar bregimen;
    @Property
    @Persist
    private Sancion nuevasancion;
    @Property
    @Persist
    private Persona_Sancion nuevapersona;
    @Property
    @Persist
    private Integer tipoFuncionarioSeleccionado;
    @Property
    @Persist
    private int maxlength;
    @Persist
    private String regeVali;
    @InjectComponent
    private TextField numero_documento;
    @Inject
    private FieldValidatorSource fieldValidatorSource;
    @Property
    @Persist
    private Entidad entidadbusqueda;
    //datos de la sancion
    @Property
    @Persist
    private DatoAuxiliar categoriasancion;
    @Property
    @Persist
    private TipoSancion tiposancion;
    @Property
    @Persist
    private TipoSancion tiposancionmostrar;
    @Property
    @Persist
    private String fechadocnot;
    @Property
    @Persist
    private String autoridadnot;
    @Property
    @Persist
    private String fechadocsan;
    @Property
    @Persist
    private String autoridadsan;
    @Property
    @Persist
    private String fecinicio;
    @Property
    @Persist
    private String fecfin;
    @Persist
    @Property
    private Date fecha_inicio;
    @Persist
    @Property
    private Date fecha_fin;
    @Persist
    @Property
    private Date fecha_docnot;
    @Persist
    @Property
    private Date fecha_docsan;
    @Property
    @Persist
    private String ayudadia;
    @Property
    @Persist
    private String ayudames;
    @Property
    @Persist
    private String ayudaanio;
    /*TO-TEST*/
    @Property
    @Persist
    private String detalleInhabilitado;
    @Property
    @Persist
    private boolean bactualmenteLaborando;
    //zonas
    @InjectComponent
    private Zone busquedaZone;
    @InjectComponent
    private Zone validacionZone;
    @InjectComponent
    private Zone sancionZone;
    @InjectComponent
    private Zone tiposancionZone;
    @InjectComponent
    private Zone busquedamodalZone;
    @InjectComponent
    private Zone inhabilitacionZone;
    /*TO-TEST*/
    @InjectComponent
    private Zone mostrarDetalle;
    @InjectComponent
    @Property
    private Zone autoridadsanZone;
    @InjectComponent
    @Property
    private Zone autoridadnotZone;
    //validaciones
//    @Property
//    @Persist
//    private Boolean bmostrar;
    @Property
    @Persist
    private Boolean bmostrarrol;
    @Property
    @Persist
    private Boolean mostrarentidad;
    @Property
    @Persist
    private Boolean mostrarlista;
    @Property
    @Persist
    private Boolean mostrarfecha;
    @Property
    @Persist
    private Boolean mostrarnuevof;
    @Property
    @Persist
    private Boolean mostrardocu;
    @Property
    @Persist
    private Boolean autoridad;
    private int elemento = 0;
    @Property
    @Persist
    private Boolean editando;
    @Property
    @Persist
    private Boolean ocultar;
    @PageActivationContext
    private Sancion modificasancion;
    @Property
    @Persist
    private List<LkBusquedaSancion> listaSancion;
    @Property
    @Persist
    private LkBusquedaSancion cs_sinreglab;
    @Property
    @Persist
    private LkBusquedaSancion accionSancion;
    @Property
    @Persist
    LkPerfilUsuarioAccesoSanciones accesoPefilSanciones;
    @Property
    @Persist
    private Boolean mostrarListaSanciones;
    @Property
    @Persist
    private Boolean soloVisualiza;
    @Property
    @Persist
    private Boolean soloVisualizaTiempo;
    @Property
    @Persist
    private Boolean tieneAdjunto;
    @Property
    @Persist
    private Suspension nuevasuspension;
    @Property
    @Persist
    private Boolean estaSuspendida;
    private long idEntidad;
    @SessionState
    @Property
    private UsuarioAcceso usua;

    @Log
    public Sancion getModificasancion() {
        return modificasancion;
    }

    @Log
    public void setModificasancion(Sancion modificasancion) {
        this.modificasancion = modificasancion;
    }

    @Log
    public org.apache.tapestry5.FieldValidator getValidator() {
        return fieldValidatorSource.createValidators(numero_documento, regeVali);
    }

    // loguear operación de entrada a pagina
    @Log
    @CommitAfter
    Object logueo() {
        new Logger().loguearOperacion(session, usuario, "", Logger.CODIGO_OPERACION_SELECT, Logger.RESULTADO_OPERACION_OK, Logger.TIPO_OBJETO_SANCION);
        if (modificasancion != null) {
            String hql = "update RNSDD_EVENTO set estadoevento=1 where tipoevento_id='" + Logger.SANCION + "' and sancion_id='" + modificasancion.getId() + "' and estadoevento=0";
            Query query = session.createSQLQuery(hql);
            query.executeUpdate();
        }
        return null;
    }

    // inicio de la pagina
    @Log
    void setupRender() {
        // Valida si tiene acceso a la pagina
        Query query = session.getNamedQuery("callSpUsuarioAccesoPagina");
        query.setParameter("in_login", usuario.getLogin());
        query.setParameter("in_pagename", _resources.getPageName().toUpperCase());
        List result = query.list();
        editando = false;
        if (result.isEmpty()) {
            System.out.println(String.valueOf("Usuario no tiene acceso a la página."));
        } else {
            usua = (UsuarioAcceso) result.get(0);
        }

        // Setea los accesos del usuario
        Criteria c = session.createCriteria(LkPerfilUsuarioAccesoSanciones.class);
        c.add(Restrictions.eq("usuarioId", Long.valueOf(usuario.getId().toString())));
        if (!c.list().isEmpty()) {
            accesoPefilSanciones = (LkPerfilUsuarioAccesoSanciones) c.list().get(0);
        }

        bcargo = false;
        regeVali = "";
        diascate = "0";
        tipoFuncionarioSeleccionado = null;
        logueo();
//        bmostrar = false;
        mostrarfecha = true;
        nuevasancion = new Sancion();
        funcionario = new Funcionario();
//        tipoFuncionarioSeleccionado = 0;
        nuevapersona = new Persona_Sancion();
        tiposancionmostrar = new TipoSancion();
        entidadbusqueda = eue;
        editasancion = false;
        limpiarbusqueda();
        limpiarsancion();

        soloVisualiza = false;
        // Obtiene el perfil del usuario
        mostrardocu = false;
//        bestrabajador = true;
        bmostrarrol = true;
        bregimen = null;
        tieneAdjunto = false;
        if (accesoPefilSanciones.getRegistroGlobal()) {
//            c = session.createCriteria(DatoAuxiliar.class);
//            c.add(Restrictions.eq("codigo", 2L));
//            c.add(Restrictions.eq("nombreTabla", "REGIMENLABORAL"));
//            bregimen = (DatoAuxiliar) c.uniqueResult();
//            bcargo = false;
//            bmostrar = true;
        } else {
            bmostrarrol = false;
            mostrardocu = true;
//            bregimen = null;
        }
        if (modificasancion != null) {
            nuevasancion = modificasancion;
            modificasancion = null;
            obtieneAccesosSobreLaSancion();
            mostrar();
            editando = true;
            if (nuevasancion.getActualmenteLaborando()) {
                bcargo = false;
            } else {
                bcargo = true;
            }
            if (nuevasancion.getTipo_sancion().getTipoInhabilitacion().getCodigo() == 2) {
                mostrarfecha = false;
                diascate = "0";
            } else {
                mostrarfecha = true;
                diascate = "0";
                soloVisualizaTiempo = false;
                if (nuevasancion.getTipo_sancion().getTiempoMaxAnios() == nuevasancion.getTipo_sancion().getTiempoMinAnios() && nuevasancion.getTipo_sancion().getTiempoMaxMeses() == nuevasancion.getTipo_sancion().getTiempoMinMeses() && nuevasancion.getTipo_sancion().getTiempoMaxDias() == nuevasancion.getTipo_sancion().getTiempoMinDias()) {
                    soloVisualizaTiempo = true;
                    ayudaanio = nuevasancion.getTipo_sancion().getTiempoMaxAnios().toString();
                    ayudames = nuevasancion.getTipo_sancion().getTiempoMaxMeses().toString();
                    ayudadia = nuevasancion.getTipo_sancion().getTiempoMaxDias().toString();
                    diascate = String.valueOf(nuevasancion.getTipo_sancion().getTiempoMaxAnios() * 365 + nuevasancion.getTipo_sancion().getTiempoMaxMeses() * 30 + nuevasancion.getTipo_sancion().getTiempoMaxDias());
                }
            }
            // Si la sancion se encuentra suspendida. Muestra los datos de la suspensión
            //nuevasuspension=(Suspension) session.load(Suspension.class, busqueda.get(0).getId());
            if (nuevasancion.getSancion_estado().getCodigo() == 4L) {
                c = session.createCriteria(Suspension.class);
                c.add(Restrictions.eq("sancion_id", Long.valueOf(nuevasancion.getId())));
                estaSuspendida = false;
                if (!c.list().isEmpty()) {
                    nuevasuspension = (Suspension) c.list().get(0);
                    estaSuspendida = true;
                }
            }
            bregimen = nuevasancion.getRegimenlaboral();
            if (!accionSancion.getAccionEditar()) {
                soloVisualiza = true;
                editando = false;
            }
            if (nuevasancion.getDocumento() != null) {
                tieneAdjunto = true;
            }
        } else {
            accionSancion = new LkBusquedaSancion();
            accionSancion.setAccionAnular(false);
            accionSancion.setAccionEditar(true);
            accionSancion.setAccionEliminar(false);
            accionSancion.setAccionImprimir(false);
            accionSancion.setAccionSuspender(false);
        }
        mostrarlista = false;
        mostrarListaSanciones = false;
    }

    @Log
    void obtieneAccesosSobreLaSancion() {
        // Obtiene las acciones que se puede realizar con la sancion
        Criteria c = session.createCriteria(LkBusquedaSancion.class);
        c.add(Restrictions.eq("id_sancion", Long.valueOf(nuevasancion.getId())));
        System.out.println("obtieneAccesosSobreLaSancion");
        if (!c.list().isEmpty()) {
            accionSancion = (LkBusquedaSancion) c.list().get(0);
            System.out.println(accionSancion);
        }
    }

    @Log
    void mostrar() {
        System.out.println("MOSTRARX");
        limpiarbusqueda();
        limpiarsancion();
        if (nuevasancion.getEstrabajador()) {
//            bmostrar = true;
            bestrabajador = true;
            nuevapersona = nuevasancion.getPersona();
            bcargo = false;
            bactualmenteLaborando = nuevasancion.getActualmenteLaborando();
        } else {
//            bmostrar = false;
            bcargo = true;
        }
        editasancion = true;
        mostrardocu = true;
        nuevapersona = nuevasancion.getPersona();
        bdocidentidad = nuevapersona.getDocumentoidentidad();
        categoriasancion = nuevasancion.getCategoria_sancion();
        tiposancion = nuevasancion.getTipo_sancion();
        tiposancionmostrar = nuevasancion.getTipo_sancion();
        detalleInhabilitado = nuevasancion.getTipo_sancion().getTipoInhabilitacion().getCodigo() == 1 ? "SI" : "NO";
        bregimen = nuevasancion.getRegimenlaboral();
        if (nuevasancion.getEntidad() != null) {
            bentidad = nuevasancion.getEntidad().getDenominacion();
        }
        entidadbusqueda = nuevasancion.getEntidad();
        if (tiposancion.getTipoInhabilitacion().getCodigo() == 1) {
            int diastiposamax = (tiposancion.getTiempoMaxAnios() * 365) + (tiposancion.getTiempoMaxMeses() * 30) + (tiposancion.getTiempoMaxDias());
            int diastiposamin = (tiposancion.getTiempoMinAnios() * 365) + (tiposancion.getTiempoMinMeses() * 30) + (tiposancion.getTiempoMinDias());
            if (diastiposamax == diastiposamin) {
                //modificado tener en cuenta
                mostrarfecha = true;
                diascate = String.valueOf(tiposancion.getTiempoMaxAnios() * 365 + tiposancion.getTiempoMaxMeses() * 30 + tiposancion.getTiempoMaxDias());
                System.out.println("aquiiiii" + diascate);
            }
        } else {
            //modificado tener en cuenta
            mostrarfecha = false;
        }
        if (nuevasancion.getFecha_docnot() != null) {
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            fechadocnot = formatoDeFecha.format(nuevasancion.getFecha_docnot());
        }
        if (nuevasancion.getFecha_docsan() != null) {
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            fechadocsan = formatoDeFecha.format(nuevasancion.getFecha_docsan());
        }
        if (nuevasancion.getFechaini_inha() != null) {
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            fecinicio = formatoDeFecha.format(nuevasancion.getFechaini_inha());
        }
        if (nuevasancion.getFechafin_inha() != null) {
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            fecfin = formatoDeFecha.format(nuevasancion.getFechafin_inha());
        }
        if (nuevasancion.getAutoridadnot().getApellidoPaterno() != null) {
            autoridadnot = nuevasancion.getAutoridadnot().getApellidoPaterno() + " ";
        }
        if (nuevasancion.getAutoridadnot().getApellidoMaterno() != null) {
            autoridadnot = autoridadnot + nuevasancion.getAutoridadnot().getApellidoMaterno() + " ";
        }
        if (nuevasancion.getAutoridadnot().getNombres() != null) {
            autoridadnot = autoridadnot + nuevasancion.getAutoridadnot().getNombres();
        }
        if (nuevasancion.getAutoridadsan().getApellidoPaterno() != null) {
            autoridadsan = nuevasancion.getAutoridadsan().getApellidoPaterno() + " ";
        }
        if (nuevasancion.getAutoridadsan().getApellidoMaterno() != null) {
            autoridadsan = autoridadsan + nuevasancion.getAutoridadsan().getApellidoMaterno() + " ";
        }
        if (nuevasancion.getAutoridadsan().getNombres() != null) {
            autoridadsan = autoridadsan + nuevasancion.getAutoridadsan().getNombres();
        }
        System.out.println("Funcionarios");
        System.out.println("Sanciona: " + autoridadsan);
        System.out.println("Notifica: " + autoridadnot);
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeandocumentoidentidad() {
        List<Long> lista = new ArrayList<Long>();
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "DOCUMENTOIDENTIDAD"));
        if (accesoPefilSanciones.getPerfilId() == 3) {
            c.add(Restrictions.eq("codigo", new Long(1)));
        }
        c.addOrder(Order.asc("abrev"));
        return new GenericSelectModel<DatoAuxiliar>(c.list(), DatoAuxiliar.class, "abrev", "id", _access);
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeanregimenlaboral() {
        List<Long> lista = new ArrayList<Long>();
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "REGIMENLABORAL"));
        if (!bestrabajador) {
            c.add(Restrictions.eq("codigo", new Long(3)));
        } else {
            if (!soloVisualiza) {
                c.add(Restrictions.ne("codigo", new Long(3)));
            }
        }
        c.add(Restrictions.ne("codigo", new Long(0)));
        c.addOrder(Order.asc("valor"));
        return new GenericSelectModel<DatoAuxiliar>(c.list(), DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    public GenericSelectModel<TipoSancion> getBeantiposancion() {
        List<LkTipoSancionRegLab> lista;
        Criteria c1 = session.createCriteria(TipoSancion.class);
        if (bregimen == null || categoriasancion == null) {
            c1.add(Restrictions.eq("id", 99999999L));
            return new GenericSelectModel<TipoSancion>(c1.list(), TipoSancion.class, "descripcion", "id", _access);
        }
        Criteria c = session.createCriteria(LkTipoSancionRegLab.class);
//        if (bregimen != null) {
        c.add(Restrictions.eq("reg_laboral", bregimen.getId()));
//        }
//        if (categoriasancion != null) {
        c.add(Restrictions.eq("categoria", categoriasancion.getId()));
//        } else {
//            c.add(Restrictions.eq("categoria", 99999999L));
//        }
        //c.setProjection(Projections.distinct(Projections.property("id_tipo")));
        lista = c.list();
        if (lista.isEmpty()) {
            c1.add(Restrictions.eq("id", 99999999L));
            return new GenericSelectModel<TipoSancion>(c1.list(), TipoSancion.class, "descripcion", "id", _access);
        } else {
            List<Long> tipoSancion = new ArrayList<Long>();
            for (int i = 0; i <= lista.size() - 1; i++) {
                tipoSancion.add(lista.get(i).getId_tipo());
            }
            c1.add(Restrictions.in("id", tipoSancion));
            c1.addOrder(Order.asc("descripcion"));
            return new GenericSelectModel<TipoSancion>(c1.list(), TipoSancion.class, "descripcion", "id", _access);
//        } else {
//            c1.add(Restrictions.isNull("id"));
        }
//        c.addOrder(Order.asc("descripcion"));
//        lista = c.list();
//        return new GenericSelectModel<TipoSancion>(lista, TipoSancion.class, "descripcion", "id", _access);
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeancategoriasancion() {
        List<DatoAuxiliar> list; // = Helpers.getDatoAuxiliar("CATEGORIASANCION", null, 0, session);
        if (bregimen == null) {
            list = Helpers.getDatoAuxiliar("NULL", null, 0, session);
        } else {
            list = Helpers.getDatoAuxiliar("CATEGORIASANCION", null, 0, session);
        }
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    public GenericSelectModel<LkCausaSancion> getBeancausasan() {
        Criteria c = session.createCriteria(LkCausaSancion.class);
        Criteria c1 = session.createCriteria(LkCausaTipoSancion.class);
        if (tiposancion != null && tiposancion.getId() != null) {
            c1.add(Restrictions.eq("idTipoSancion", tiposancion.getId()));
            c1.setProjection(Projections.distinct(Projections.property("id")));
            if (c1.list().isEmpty()) {
                c.add(Restrictions.eq("id", 999999999L));
            } else {
                c.add(Restrictions.in("id", c1.list()));
            }
        } else {
            c.add(Restrictions.eq("id", 999999999L));
        }
        c.addOrder(Order.asc("desccausasancion"));
        return new GenericSelectModel<LkCausaSancion>(c.list(), LkCausaSancion.class, "desccausasancion", "id", _access);
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeantipodocnot() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPODOCUMENTO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    public GenericSelectModel<DatoAuxiliar> getBeantipodocsan() {
        List<DatoAuxiliar> list = Helpers.getDatoAuxiliar("TIPODOCUMENTO", null, 0, session);
        return new GenericSelectModel<DatoAuxiliar>(list, DatoAuxiliar.class, "valor", "id", _access);
    }

    @Log
    Object onBuscarenti() {
        mostrarentidad = true;
        mostrarlista = false;
        bdenoentidad = null;
        return new MultiZoneUpdate("busquedaZone", busquedaZone.getBody()).add("busquedamodalZone", busquedamodalZone.getBody());
    }

    @Log
    Object onBuscartraba() {
        mostrarentidad = false;
        mostrarlista = false;
        bnomtrabajador = null;
        return new MultiZoneUpdate("busquedaZone", busquedaZone.getBody()).add("busquedamodalZone", busquedamodalZone.getBody());
    }

    @Log
    Object onBuscarpersona() {
        Criteria c;
        formvalidacion.clearErrors();
        if (bdocidentidad == null) {
            envelope.setContents("Tiene que ingresar Tipo Documento");
            return zonasDatos();
        }
        if (nuevapersona.getNroDocumento() == null) {
            envelope.setContents("Tiene que ingresar Numero de Documento");
            return zonasDatos();
        }
        c = session.createCriteria(LkBusquedaSancion.class);
//        if (accesoPefilSanciones.getPerfilId() == 3) { // adm entidad
//            c.add(Restrictions.eq("entidad_id", usuario.getEntidad().getId()));
//        }

        if (bdocidentidad != null) {
            c.add(Restrictions.eq("tipo_doc_persona", bdocidentidad.getId()));
        }
        if (nuevapersona.getNroDocumento() != null) {
            c.add(Restrictions.like("nro_doc_persona", "%" + nuevapersona.getNroDocumento() + "%").ignoreCase());
        }

        List<Long> estados = new ArrayList<Long>();
        estados.add(1L);
        if (!estados.isEmpty()) {
            c.add(Restrictions.in("estado_id", estados));
        }

        listaSancion = c.list();
        if (listaSancion.isEmpty()) {
            mostrarListaSanciones = false;
        } else {
            mostrarListaSanciones = true;
        }
        mostrardocu = true;
        List<Persona_Sancion> busqueda_persona = getListaPersona(nuevapersona.getNroDocumento());
        System.out.println("aquii" + nuevapersona.getNroDocumento());
        if (busqueda_persona.size() > 0) {
            nuevapersona = (Persona_Sancion) session.load(Persona_Sancion.class, busqueda_persona.get(0).getId());
            nuevasancion.setPersona(nuevapersona);
            System.out.println("encontradaaaaaaaa" + nuevasancion.getPersona());
            return zonasDatos();
        }

        if (bdocidentidad.getCodigo() == 1) {
            c = session.createCriteria(ConfiguracionAcceso.class);
            ConfiguracionAcceso parametro = (ConfiguracionAcceso) c.uniqueResult();

            if (parametro.getUseReniec() == 0) {
                nuevapersona.setNombres("Nombre Consulta");
                nuevapersona.setApellidoPaterno("Apellido Paterno Consulta");
                nuevapersona.setApellidoMaterno("Apellidos Materno Consulta");
                nuevapersona.setDireccion("Direccion Consulta");
//                nuevapersona.setCargado(true);
                return zonasDatos();
            } else {
                // VERIFICACION DE LOS PARAMETROS CON RESPECTO AL NRO DE PETICIONES TOTALES
                System.out.println("NRO CONSULTAS - EN TOTAL " + parametro.getNroConsultasActuales());
                if (parametro.getNroConsultasActuales() == null || parametro.getNroConsultasActuales() == 0) {
                    envelope.setContents("Se superaron el # de consultas al service por el dia de hoy");
                    return zonasDatos();
                }
                // VERIFICACION DE LOS PARAMETROS CON RESPECTO AL NRO DE PETICIONES (ENTIDAD)        
                System.out.println("NRO CONSULTAS - PARA LA ENTIDAD " + eue.getPeticiones_ws_Reniec());
                if (usuario.getEntidad().getPeticiones_ws_Reniec() == null || usuario.getEntidad().getPeticiones_ws_Reniec() == 0) {
                    envelope.setContents("Se superaron el # de consultas al service para la entidad por el dia de hoy");
                    return zonasDatos();
                }
                try {
                    ServicioReniec sre = new ServicioReniec();
                    sre.obtenerToken();
                    nuevapersona.setNombres("");
                    nuevapersona.setApellidoPaterno("");
                    nuevapersona.setApellidoMaterno("");
                    if (sre.validarToken(session)) {
                        List<String> listare = sre.obtenerResultado(nuevapersona.getNroDocumento());
                        // DISMINUCION DE NRO DE PETICIONES
                        usuario.getEntidad().setPeticiones_ws_Reniec(usuario.getEntidad().getPeticiones_ws_Reniec() - 1);
                        session.saveOrUpdate(usuario.getEntidad());
                        parametro.setNroConsultasActuales(parametro.getNroConsultasActuales() - 1);
                        session.saveOrUpdate(parametro);
                        if (sre.validarEstadoConsulta(listare.get(0), session)) {
                            nuevapersona.setNombres(listare.get(4));
                            nuevapersona.setApellidoPaterno(listare.get(1));
                            nuevapersona.setApellidoMaterno(listare.get(2));
                            //  nuevapersona=new Persona_Sancion();                    
                            nuevapersona.setDireccion(listare.get(11));
                            if (listare.get(13).equals("1")) {
                                nuevapersona.setSexo("M");
                            } else if (listare.get(13).equals("2")) {
                                nuevapersona.setSexo("F");
                            }
                            SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyyMMdd");
                            nuevapersona.setFecha_nacimiento(formatoFecha.parse(listare.get(14)));
                        } else {
                            envelope.setContents(sre.mensajeError);//ERROR EN CONSULTA
                        }
                        return zonasDatos();
                    } else {
                        envelope.setContents(sre.mensajeError);//ERROR TOKEN
                    }
                    return zonasDatos();
                } catch (Exception ex) {
                    System.out.println(ex.getCause());
                    return zonasDatos();
                }
            }
        } else {
            mostrardocu = false;
            return zonasDatos();
        }
    }

    @Log
    public List<Persona_Sancion> getListaPersona(String documento) {
        Criteria c = session.createCriteria(Persona_Sancion.class);
        c.add(Restrictions.eq("nroDocumento", documento));
        return c.list();
    }

    @Log
    @CommitAfter
    Object onSuccessFromformbusqueda() {
        if (elemento == 1) {
            mostrarlista = false;
            bdenoentidad = null;
            return zonasDatos();
        } else if (elemento == 2) {
            mostrarlista = false;
            bnomtrabajador = null;
            return zonasDatos();
        } else if (elemento == 3) {
        }
        return busquedaZone.getBody();
    }

    @Log
    @CommitAfter
    Object onSuccessFromformvalidacion() {
        Criteria c;
        c = session.createCriteria(DatoAuxiliar.class);
        if (bestrabajador) {
//            bmostrar = true;
            bcargo = false;
//            c.add(Restrictions.eq("codigo", 2L));
//            c.add(Restrictions.eq("nombreTabla", "REGIMENLABORAL"));
//            bregimen = (DatoAuxiliar) c.uniqueResult();
            bregimen = null;
        } else {
//            bmostrar = false;
            bpuesto = null;
            bcargo = true;
            c.add(Restrictions.eq("codigo", 3L));
            c.add(Restrictions.eq("nombreTabla", "REGIMENLABORAL"));
            bregimen = (DatoAuxiliar) c.uniqueResult();
        }
        tiposancionmostrar = new TipoSancion();
        tiposancion = new TipoSancion();
        categoriasancion = new DatoAuxiliar();
        return zonasDatos();
    }

    @Log
    Object onBuscarautoridadnot() {
        tipoFuncionarioSeleccionado = 2;
        return null;
    }

    @Log
    Object onBuscarautoridadsan() {
        tipoFuncionarioSeleccionado = 1;
        return null;
    }

    @Log
    public List<LkBusquedaEntidad> getListadoEntidades() {
        List<LkBusquedaEntidad> listaEntidad;
        Criteria c = session.createCriteria(LkBusquedaEntidad.class);
        c.add(Restrictions.eq("estado", true));
        if (bdenoentidad != null) {
            c.add(Restrictions.disjunction().
                    add(Restrictions.like("denominacion", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("denominacion", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("descriptores", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("ñ", "n") + "%").ignoreCase()).
                    add(Restrictions.like("SIGLA", "%" + bdenoentidad.replaceAll("n", "ñ") + "%").ignoreCase()));
        }
        listaEntidad = c.list();
        nroentidad = Integer.toString(listaEntidad.size());
        return listaEntidad;
    }

    @Log
    @CommitAfter
    Object onSuccessFromformbusquedaentidad() {
        mostrarlista = true;
        return busquedamodalZone.getBody();
    }
    @Persist
    @Property
    private String nroentidad;
//    @Persist
//    @Property
//    private String nrotrabajador;

    @Log
    Object onActionFromSeleccionarentidad(Entidad enti) {
        entidadbusqueda = enti;
        bentidad = enti.getDenominacion();
        return busquedaZone.getBody();
    }

    @Log
    private MultiZoneUpdate zonasDatos() {
        MultiZoneUpdate mu;
        mu = new MultiZoneUpdate("busquedaZone", busquedaZone.getBody()).add("validacionZone", validacionZone.getBody()).add("sancionZone", sancionZone.getBody());
        return mu;
    }

    @Log
    void limpiarbusqueda() {
        //bdocidentidad = null;
        nuevapersona = new Persona_Sancion();
        //bregimen = null;
        bpuesto = null;
        tiposancionmostrar = new TipoSancion();
        detalleInhabilitado = null;
    }

    @Log
    void limpiarsancion() {
        funcionario = new Funcionario();
        bentidad = null;
        categoriasancion = null;
        tiposancion = new TipoSancion();
        autoridadnot = "";
        autoridadsan = "";
        fechadocnot = null;
        fechadocsan = null;
        fecinicio = null;
        fecfin = null;
        if (accesoPefilSanciones.getPerfilId() == 3) {
            bestrabajador = true;
        } else {
            bestrabajador = false;
        }
        ayudadia = null;
        ayudames = null;
        ayudaanio = null;
        bmostrarauto = false;
        mostrarListaSanciones = false;
    }
//@Log
//    void calcular(int dias) {
////        System.out.println("aquiiiiiii"+dias);     
//        int anio = (dias / 365);
//        int mes = ((dias % 365) / 30);
//        int dia = ((dias % 365) % 30);
//        nuevasancion.setTiem_ser_anio(String.valueOf(anio));
//        nuevasancion.setTiem_ser_mes(String.valueOf(mes));
//        nuevasancion.setTiem_ser_dia(String.valueOf(dia));
//    }

    @Log
    Object onReset() {
        nuevasancion = new Sancion();
        limpiarbusqueda();
        limpiarsancion();
        editando = false;
        return zonasDatos();
    }

    @Log
    Object onCancel() {
        return "ConsultaSanciones";
    }
    @Inject
    @Path(value = "context:WEB-INF/reports/RegistroSancion.jrxml")
    private Asset RegistroSancion;

    @Log
    StreamResponse onVerReporteSancion() throws IOException, JRException {
        Encriptacion encripta = new Encriptacion();
        InputStream is = RegistroSancion.getResource().openStream();
        listaSancion = new ArrayList<LkBusquedaSancion>();
        LkBusquedaSancion sancion = new LkBusquedaSancion();
        Criteria c = session.createCriteria(LkBusquedaSancion.class);
        c.add(Restrictions.eq("id_sancion", nuevasancion.getId()));
        JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(c.list());

        Map reportParams = new HashMap();
        //reportParams.put("TITLE", "SOME REPORT TITLE");

        JasperDesign reportDesign = JRXmlLoader.load(is);
        JasperReport reportCompiled = JasperCompileManager.compileReport(reportDesign);
        JasperPrint reportPrinted = JasperFillManager.fillReport(reportCompiled, reportParams, ds);

        ByteArrayInputStream bais = new ByteArrayInputStream(JasperExportManager.exportReportToPdf(reportPrinted));

        return new PDFStreamResponse(bais, encripta.MD5("ReporteServir" + sancion.getId_sancion()));
    }

    @Log
    void onSelectedFromCalc() {
        elemento = 1;
        if (fechadocnot != null) {
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
            try {
                fecha_docnot = (Date) formatoDelTexto.parse(fechadocnot);
            } catch (ParseException ex) {
                ex.printStackTrace();
            }
            fecha_inicio = calcularfechainicio();
            SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
            fecinicio = formatoDeFecha.format(fecha_inicio);
            fecha_fin = calcularfecha();
            fecfin = formatoDeFecha.format(fecha_fin);
        }
    }

    @Log
    @CommitAfter
    Object onSuccessFromformsancion() {
        formsancion.clearErrors();
        if (elemento == 1) {
            return new MultiZoneUpdate("sancionZone", sancionZone.getBody());
        } else {
            if (!validarpersona()) {
                return zonasDatos();
            }
            if (autoridadnot.equals("")) {
                envelope.setContents("Tiene que ingresar la Autoridad que Notifica");
                return zonasDatos();
            }
            if (bregimen == null) {
                envelope.setContents("Tiene que ingresar Regimen Laboral.");
                return zonasDatos();
            }
            if (autoridadsan.equals("")) {
                envelope.setContents("Tiene que ingresar la Autoridad que Sanciona");
                return zonasDatos();
            }
            if (fechadocsan != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fecha_docsan = (Date) formatoDelTexto.parse(fechadocsan);
                    if (fecha_docsan.before(new Date()) || fecha_docsan.equals(new Date())) {
                    } else {
                        envelope.setContents("La Fecha de Documento que Sanciona debe ser menor o igual a la Fecha de Actual.");
                        return zonasDatos();
                    }
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
            if (fechadocnot != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fecha_docnot = (Date) formatoDelTexto.parse(fechadocnot);
                    if (fecha_docnot.after(fecha_docsan) || fecha_docnot.equals(fecha_docsan)) {
                    } else {
                        envelope.setContents("La Fecha de Documento que Notifica debe ser mayor o igual a la Fecha de Sanción");
                        return zonasDatos();
                    }
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
            if (fechadocnot != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fecha_docnot = (Date) formatoDelTexto.parse(fechadocnot);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }
            if (tiposancion.getTipoInhabilitacion().getCodigo() == 1) {
//                fecha_inicio = calcularfechainicio();
//                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//                fecinicio = formatoDeFecha.format(fecha_inicio);
//                fecha_fin = calcularfechafin();
//                formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//                fecfin = formatoDeFecha.format(fecha_fin);
//                System.out.println("finnnnnn" + fecha_fin);
                onSelectedFromCalc();
                int diastiposamax = (tiposancion.getTiempoMaxAnios() * 365) + (tiposancion.getTiempoMaxMeses() * 30) + (tiposancion.getTiempoMaxDias());
                int diastiposamin = (tiposancion.getTiempoMinAnios() * 365) + (tiposancion.getTiempoMinMeses() * 30) + (tiposancion.getTiempoMinDias());
                if (diastiposamax == diastiposamin) {
                } else {
//                    if (fecfin == null) {
//                        envelope.setContents("Tiene que calcular la Fecha de Fin");
//                        return zonasDatos();
//                    }
                    if (calcularperiodo() >= diastiposamin && calcularperiodo() <= diastiposamax) {
                    } else {
                        envelope.setContents("El Periodo de Inhabilitación debe ser mayor a : " + String.valueOf(diastiposamin) + " días y menor a : " + String.valueOf(diastiposamax) + " dias");
                        return zonasDatos();
                    }
                }
            }
//            if (tiposancion.getTipoInhabilitacion().getCodigo() == 1) {
//                int diastiposamax = (tiposancion.getTiempoMaxAnios() * 365) + (tiposancion.getTiempoMaxMeses() * 30) + (tiposancion.getTiempoMaxDias());
//                int diastiposamin = (tiposancion.getTiempoMinAnios() * 365) + (tiposancion.getTiempoMinMeses() * 30) + (tiposancion.getTiempoMinDias());
//                fecha_inicio = calcularfechainicio();
//                SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
//                fecinicio = formatoDeFecha.format(fecha_inicio);
//                if (diastiposamax == diastiposamin) {
//                    //calculo fecha automatica
//                    fecha_fin = calcularfechafin();
//                } else {
//                    if (calcularperiodo() >= diastiposamin && calcularperiodo() <= diastiposamax) {
//                    } else {
//                        envelope.setContents("El Periodo de Inhabilitación debe ser mayor a : " + String.valueOf(diastiposamin) + " días y menor a : " + String.valueOf(diastiposamax) + " dias");
//                        return zonasDatos();
//                    }
//                }
//            }
            // sancion
            if (fecinicio != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fecha_inicio = (Date) formatoDelTexto.parse(fecinicio);
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
//                if (nuevasancion.getSancion_estado() == null) {
                System.out.print("Fecha inicio : " + fecha_inicio);
                if (fecha_inicio.before(new Date()) || fecha_inicio.equals(new Date())) {
                    nuevasancion.setSancion_estado(getEstados((long) 1).get(0));
                } else {
                    nuevasancion.setSancion_estado(getEstados((long) 2).get(0));
                }
                //}
            } else {
                System.out.print("Fecha nula");
                // if (nuevasancion.getSancion_estado() == null) {
                nuevasancion.setSancion_estado(getEstados((long) 2).get(0));
                // }
            }
            if (fecfin != null) {
                SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
                try {
                    fecha_fin = (Date) formatoDelTexto.parse(fecfin);
                    if (fecha_fin.before(fecha_inicio)) {
                        envelope.setContents("La Fecha de Fin no puede ser menor a la Fecha de Inicio");
                        return zonasDatos();
                    }
                } catch (ParseException ex) {
                    ex.printStackTrace();
                }
            }

            if (nuevasancion.getPersona() != null) {
                if (getBusquedaSancionDocumento().size() > 0) {
                    envelope.setContents("El Documento de Notificacion o Sancion ya ha sido registrado para la Persona a Sancionar");
                    return zonasDatos();
                }
            } else {
                List<Persona_Sancion> busqueda_persona = getListaPersona(nuevapersona.getNroDocumento());
                if (busqueda_persona.size() > 0) {
                    nuevapersona = (Persona_Sancion) session.load(Persona_Sancion.class, busqueda_persona.get(0).getId());
                    nuevasancion.setPersona(nuevapersona);
                    if (getBusquedaSancionDocumento().size() > 0) {
                        envelope.setContents("El Documento de Notificacion o Sancion ya ha sido registrado para la Persona a Sancionar");
                        return zonasDatos();
                    }
                } else {
                    nuevapersona.setDocumentoidentidad(bdocidentidad);
                    session.saveOrUpdate(nuevapersona);
                    session.flush();
                    nuevasancion.setPersona(nuevapersona);
                }
            }

            nuevasancion.setCategoria_sancion(categoriasancion);
            nuevasancion.setFecha_docnot(fecha_docnot);
            nuevasancion.setFecha_docsan(fecha_docsan);
            nuevasancion.setFechafin_inha(fecha_fin);
            nuevasancion.setFechaini_inha(fecha_inicio);
            if (tiposancion.getTipoInhabilitacion().getCodigo() == 2) {
                nuevasancion.setFechafin_inha(null);
                nuevasancion.setFechaini_inha(null);
                nuevasancion.setSancion_estado(getEstados((long) 2).get(0));
            }
            nuevasancion.setTipo_sancion(tiposancion);
            nuevasancion.setActualmenteLaborando(bactualmenteLaborando);
            nuevasancion.setEstrabajador(bestrabajador);

//            if (bestrabajador) {
            nuevasancion.setEntidad(entidadbusqueda);
            idEntidad = nuevasancion.getEntidad().getId();
//            }
            nuevasancion.setRegimenlaboral(bregimen);
            // Actualiza el id del usuario que creo o modifico la sancion
            if (!editando) {
                nuevasancion.setUsuarioId(usuario.getId());
                nuevasancion.setPerfilId(accesoPefilSanciones.getPerfilId());
            }
            nuevasancion.setFecha_creacion(new Date());
            session.saveOrUpdate(entidadbusqueda);
            session.saveOrUpdate(nuevasancion);
            session.flush();
            //new Logger().loguearOperacion(session, usuario, String.valueOf(nuevasancion.getId()), (editando ? Logger.CODIGO_OPERACION_UPDATE : Logger.CODIGO_OPERACION_INSERT), Logger.RESULTADO_OPERACION_OK, Logger.TIPO_OBJETO_SANCION);
            if (editando) {
                new Logger().loguearEvento(session, Logger.SANCION, idEntidad, nuevasancion.getPersona().getId(), usuario.getId(), "REGISTRO DE SANCIÓN", 0, nuevasancion.getId());
                //new Logger().saveEvento(session, "SANCION", Logger.SANCION, nuevasancion.getId(), "SANCION MODIFICADA - ", usuario.getId());
                envelope.setContents(helpers.Constantes.SANCION_MODIFICADA_EXITO);
            } else {
                new Logger().loguearEvento(session, Logger.SANCION, idEntidad, nuevasancion.getPersona().getId(), usuario.getId(), "MODIFICACIÓN DE SANCIÓN", 0, nuevasancion.getId());
                //new Logger().saveEvento(session, "SANCION", Logger.SANCION, nuevasancion.getId(), "SANCION REGISTRADA", usuario.getId());
                envelope.setContents(helpers.Constantes.SANCION_CREADA_EXITO);
                editasancion = true;
                mostrardocu = true;
            }
            editando = true;
            obtieneAccesosSobreLaSancion();
            return zonasDatos();
        }
    }

    @Log
    public List<LkBusquedaSancion> getBusquedaSancionDocumento() {
        Criteria c = session.createCriteria(LkBusquedaSancion.class);
        c.add(Restrictions.eq("persona_id", nuevasancion.getPersona().getId()));
        Criterion rest1 = Restrictions.eq("descripcion_doc_notifica", nuevasancion.getNumdocnot()).ignoreCase();
        Criterion rest2 = Restrictions.eq("descripcion_doc_sanciona", nuevasancion.getNumdocsan()).ignoreCase();
        c.add(Restrictions.or(rest1, rest2));
        if (nuevasancion.getId() != 0) {
            c.add(Restrictions.ne("id_sancion", nuevasancion.getId()));
        }
        //c.add(Restrictions.disjunction().add(Restrictions.like("nombrefuncionario","%"+ bnomautoridad + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario","%"+ bnomautoridad.replaceAll("ñ", "n") + "%").ignoreCase()).add(Restrictions.like("nombrefuncionario","%"+ bnomautoridad.replaceAll("n", "ñ") + "%").ignoreCase()));
        return c.list();
    }

    @Log
    public List<DatoAuxiliar> getEstados(long cod) {
        Criteria c = session.createCriteria(DatoAuxiliar.class);
        c.add(Restrictions.eq("nombreTabla", "ESTADOSANCION"));
        c.add(Restrictions.eq("codigo", cod));
        return c.list();
    }

    @Log
    int calcularperiodo() {
        String consulta = "SELECT 1 ID,to_number(to_date('" + fecfin + "','dd/mm/yyyy') - to_date('" + fecinicio + "','dd/mm/yyyy')) DIAS from dual";
        Query query = session.createSQLQuery(consulta).addEntity(LkConsultaPeriodo.class);
        List result = query.list();
        LkConsultaPeriodo lkcondos = (LkConsultaPeriodo) result.get(0);
        return lkcondos.getDias();
    }

    @Log
    Date calcularfecha() {
        int dias, meses, anios;
        if (ayudadia == null) {
            dias = 0;
        } else {
            dias = Integer.parseInt(ayudadia);
        }
        if (ayudames == null) {
            meses = 0;
        } else {
            meses = Integer.parseInt(ayudames);
        }
        if (ayudaanio == null) {
            anios = 0;
        } else {
            anios = Integer.parseInt(ayudaanio);
        }
        int totaldias = dias + meses * 30 + anios * 365;
        String consulta = "SELECT 1 ID,to_date('" + fecinicio + "','dd/mm/yyyy') + to_number('" + totaldias + "') FECHA  from dual";
        Query query = session.createSQLQuery(consulta).addEntity(LkSumaFecha.class);
        List result = query.list();
        LkSumaFecha lkcondos = (LkSumaFecha) result.get(0);
        return lkcondos.getFecha();
    }

    @Log
    Date calcularfechainicio() {
//        String consulta ="SELECT 1 ID,to_date('"+fechadocnot+"','dd/mm/yyyy') + to_number('"+1+"') FECHA  from dual";
//        Query query =session.createSQLQuery(consulta).addEntity(LkSumaFecha.class);  
//        List result = query.list();        
//        LkSumaFecha lkcondos = (LkSumaFecha) result.get(0);
        Calendar c1 = Calendar.getInstance();
        c1.setTime(fecha_docnot);
        c1.add(Calendar.DATE, 1);
        return c1.getTime();
    }

    @Log
    Date calcularfechafin() {
        String consulta = "SELECT 1 ID,to_date('" + fecinicio + "','dd/mm/yyyy') + to_number('" + Integer.parseInt(diascate) + "') FECHA  from dual";
        Query query = session.createSQLQuery(consulta).addEntity(LkSumaFecha.class);
        List result = query.list();
        LkSumaFecha lkcondos = (LkSumaFecha) result.get(0);
        System.out.println("fechafinnnnnnnnn" + fecinicio + diascate);
        return lkcondos.getFecha();
    }

    @Log
    boolean validarpersona() {
        boolean vali = true;
        boolean validaDocumento = true;

        // Si perfil es Administrador de Servir y el Tipo de Sanción está configurado para que admita sancionados sin documento de identidad
        // no valida documento
        if (accesoPefilSanciones.getPerfilId() == 2 && tiposancion.getSinDocPerfilServir()) {
            validaDocumento = false;
        }

        if (validaDocumento) {
            if (accesoPefilSanciones.getPerfilId() == 3) {
                if (bdocidentidad == null) {
                    envelope.setContents("Tiene que ingresar Tipo Documento");
                    vali = false;
                }
                if (nuevapersona.getNroDocumento() == null) {
                    envelope.setContents("Tiene que ingresar Numero Documento");
                    vali = false;
                }
            }
            if (bdocidentidad != null) {
                if (bdocidentidad.getCodigo() == 1) {
                    if (nuevapersona.getNroDocumento().length() > 8 || nuevapersona.getNroDocumento().length() < 8) {
                        envelope.setContents("El número de documento debe tener 8 dígitos (y solo números)");
                        vali = false;
                    }
                    try {
                        Integer.parseInt(nuevapersona.getNroDocumento());
                    } catch (NumberFormatException ex) {
                        envelope.setContents("El número de documento debe tener 8 dígitos (y solo números)");
                        vali = false;
                    }
                }
                if (bdocidentidad.getCodigo() == 2) {
                    if (nuevapersona.getNroDocumento().length() > 12 || nuevapersona.getNroDocumento().length() < 12) {
                        envelope.setContents("El número de documento debe tener 12 dígitos (y solo números)");
                        vali = false;
                    }
                    try {
                        Long.parseLong(nuevapersona.getNroDocumento());
                    } catch (NumberFormatException ex) {
                        envelope.setContents("El número de documento debe tener 12 dígitos (y solo números)");
                        vali = false;
                    }
                }
            }
        }

        if (nuevapersona.getNombres() == null) {
            envelope.setContents("Tiene que ingresar el Nombre de la Persona");
            vali = false;
        }
        if (nuevapersona.getApellidoPaterno() == null) {
            envelope.setContents("Tiene que ingresar el Apellido Paterno");
            vali = false;
        }
        if (nuevapersona.getApellidoMaterno() == null) {
            envelope.setContents("Tiene que ingresar el Apellido Materno");
            vali = false;
        }
//        List<Trabajador> busqueda=getListaTrabajador(nuevapersona.getNroDocumento());
        if (bestrabajador) {
            if (nuevasancion.getPuestocargo() == null) {
                envelope.setContents("Tiene que ingresar Cargo/Puesto");
                vali = false;
            }
        }
        return vali;
    }

    @Log
    void onBnomtrabaautoridadChanged() {
        if (_request.getParameter("param") != null) {
            bnomtrabaautoridad = _request.getParameter("param");
        }
    }

    @Log
    void onBnumerodocumentoChanged() {
        if (_request.getParameter("param") != null) {
            nuevapersona.setNroDocumento(_request.getParameter("param"));
        }
    }

    @Log
    void onBnombresChanged() {
        if (_request.getParameter("param") != null) {
            nuevapersona.setNombres(_request.getParameter("param"));
        }
    }

    @Log
    void onBapaternoChanged() {
        if (_request.getParameter("param") != null) {
            nuevapersona.setApellidoPaterno(_request.getParameter("param"));
        }
    }

    @Log
    void onBamaternoChanged() {
        if (_request.getParameter("param") != null) {
            nuevapersona.setApellidoMaterno(_request.getParameter("param"));
        }
    }

    @Log
    void onTiempoanioChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setTiem_ser_anio(_request.getParameter("param"));
        }
    }

    @Log
    void onTiempomesChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setTiem_ser_mes(_request.getParameter("param"));
        }
    }

    @Log
    void onTiempodiaChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setTiem_ser_dia(_request.getParameter("param"));
        }
    }

    @Log
    void onEstado_puestoChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setEstadopuestocargo(_request.getParameter("param").toUpperCase());
        }
    }

    @Log
    void onPuesto_cargoChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setPuestocargo(_request.getParameter("param").toUpperCase());
        }
    }

    @Log
    void onNum_docnotChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setNumdocnot(_request.getParameter("param").toUpperCase());
        }
    }

    @Log
    void onNum_docsanChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setNumdocsan(_request.getParameter("param").toUpperCase());
        }
    }

    @Log
    void onObservacionesChanged() {
        if (_request.getParameter("param") != null) {
            nuevasancion.setObservaciones(_request.getParameter("param").toUpperCase());
        }
    }

    @Log
    Object onValueChangedFromRegimen_laboral(DatoAuxiliar dato) {
        tiposancionmostrar = new TipoSancion();
        tiposancion = new TipoSancion();
        categoriasancion = new DatoAuxiliar();
        detalleInhabilitado = null;
        System.out.println("fechaaaentrooo" + fechadocnot);
        if (fechadocnot != null) {
            SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yyyy");
            try {
                fecha_docnot = (Date) formatoDelTexto.parse(fechadocnot);
            } catch (ParseException ex) {
                ex.printStackTrace();
            }
            System.out.println("fechaaaentrooo" + fechadocnot);
        }
        return new MultiZoneUpdate("sancionZone", sancionZone.getBody());
    }

    @Log
    Object onValueChangedFromCategoria_sancion(DatoAuxiliar dato) {
        tiposancionmostrar = new TipoSancion();
        tiposancion = new TipoSancion();
        detalleInhabilitado = null;
        bmostrarauto = false;
        return new MultiZoneUpdate("tiposancionZone", tiposancionZone.getBody()).add("mostrarDetalle", mostrarDetalle.getBody()).add("autoridadsanZone", autoridadsanZone.getBody()).add("autoridadnotZone", autoridadnotZone.getBody());
    }
    @Persist
    @Property
    private String diascate;

    @Log
    Object onValueChangedFromTipo_sancion(TipoSancion dato) {
        if (dato != null) {
            ayudaanio = "";
            ayudames = "";
            ayudadia = "";
            if (dato.getTipoInhabilitacion().getCodigo() == 2) {
                mostrarfecha = false;
                fecinicio = null;
                fecfin = null;
                diascate = "0";
                tiposancionmostrar = dato;
            } else {
                tiposancionmostrar = dato;
                mostrarfecha = true;
                diascate = "0";
                soloVisualizaTiempo = false;
                if (dato.getTiempoMaxAnios() == dato.getTiempoMinAnios() && dato.getTiempoMaxMeses() == dato.getTiempoMinMeses() && dato.getTiempoMaxDias() == dato.getTiempoMinDias()) {
                    soloVisualizaTiempo = true;
                    fecinicio = null;
                    fecfin = null;
                    ayudaanio = dato.getTiempoMaxAnios().toString();
                    ayudames = dato.getTiempoMaxMeses().toString();
                    ayudadia = dato.getTiempoMaxDias().toString();
                    diascate = String.valueOf(dato.getTiempoMaxAnios() * 365 + dato.getTiempoMaxMeses() * 30 + dato.getTiempoMaxDias());
                }
            }
            /*detalleInhabilitado = dato.getEstadoRegistro();*/
            tiposancionmostrar = dato;
            detalleInhabilitado = dato.getTipoInhabilitacion().getCodigo() == 1 ? "SI" : "NO";
            bmostrarauto = true;
        } else {
            tiposancionmostrar = new TipoSancion();
            mostrarfecha = true;
            bmostrarauto = false;
        }
        /*TO-TEST: se agrego mostrarDetalle*/
//        ajaxResponseRenderer.      .addRender("funcionarioZone", funcionarioZone)
//                ;
        return new MultiZoneUpdate("inhabilitacionZone", inhabilitacionZone.getBody())
                .add("mostrarDetalle", mostrarDetalle.getBody())
                .add("autoridadsanZone", autoridadsanZone.getBody())
                .add("autoridadnotZone", autoridadnotZone.getBody());
    }

    @Log
    Object onValueChangedFromDocumento_identidad(DatoAuxiliar dato) {
        mostrardocu = true;
        if (dato != null) {
            if (dato.getCodigo() == 1) {
                //mostrardocu = true;
                regeVali = "required,regexp=^[0-9]{8}$";
                maxlength = 8;

            } else {
                //mostrardocu = false;
                regeVali = "required,regexp=^[a-zA-Z0-9]{12}$";
                maxlength = 12;
            }
        } else {
            mostrardocu = false;
            regeVali = "";
            maxlength = 12;
        }
//        nuevapersona.setCargado(false);
        limpiarbusqueda();
        return new MultiZoneUpdate("busquedaZone", busquedaZone.getBody());
    }

    @Log
    public String getActualizaFuncionario(Integer seleccion) {
        String nombreFuncionario = "";
        System.out.println("titular");
        System.out.println("@@@" + tipoFuncionarioSeleccionado);
        if (tipoFuncionarioSeleccionado != null) {
            if (funcionario != null) {
                if (funcionario.getApellidoPaterno() != null) {
                    nombreFuncionario = funcionario.getApellidoPaterno();
                }
                if (funcionario.getApellidoMaterno() != null) {
                    nombreFuncionario += ' ' + funcionario.getApellidoMaterno();
                }
                if (funcionario.getNombres() != null) {
                    nombreFuncionario += ' ' + funcionario.getNombres();
                }
                if (tipoFuncionarioSeleccionado == 1) {
                    autoridadsan = nombreFuncionario;
                    nuevasancion.setAutoridadsan(funcionario);
                }
                if (tipoFuncionarioSeleccionado == 2) {
                    autoridadnot = nombreFuncionario;
                    nuevasancion.setAutoridadnot(funcionario);
                }
                tipoFuncionarioSeleccionado = 0;
                System.out.println("autoridadsan " + autoridadsan);
                System.out.println("autoridadnot " + autoridadnot);
            } else {
                funcionario = new Funcionario();
            }
        }
        return "";
    }

    @Log
    public List<LkBusquedaSancion> getBusquedaSancionadosSinRegLab() {

        return listaSancion;
    }

    @Log
    public Boolean getMostrarFuncionario() {
        if (tiposancion == null || tiposancion.getId() == null) {
            return false;
        } else {
            return true;
        }
    }
    @Property
    @Persist
    private UploadedFile fileNuevo;
    @Property
    @Persist
    private UploadedFile fileNuevoCopia;
    @Property
    @Persist
    private File copied;
    @InjectComponent
    private Zone adjuntoZone;
    @Component(id = "formAdjunto")
    private Form formAdjunto;
    @Persist
    private String STARTPATH;

//    @Persist
//    @Property
//    private List<UploadedFile> uploads;
//    @SuppressWarnings("unused")
//    @Property
//    @Persist(PersistenceConstants.FLASH)
//    private String fileContent;
    @Log
    @CommitAfter
    Object onSuccessFromFormAdjunto() throws IOException {
        Link link = pageRenderLinkSource.createPageRenderLinkWithContext(ABMSancion.class, nuevasancion.getId());
        if (fileNuevo == null) {
            formvalidacion.recordError("Seleccione archivo a adjuntar.");
            return link;
        }
        System.out.println("Cargando archivo.");
        if (fileNuevoCopia != null) {
            System.out.println("NOMBRE DE ARCHIVO ANTERIOR: " + fileNuevoCopia.getFileName());
        }
        fileNuevoCopia = fileNuevo;

        System.out.println("NOMBRE DE ARCHIVO SUBIDO: " + fileNuevo.getFileName());
        //return new MultiZoneUpdate("fileZone", fileZone.getBody());
        Blob blob = Hibernate.createBlob(fileNuevo.getStream());
//        nuevasancion.setDocumento(fileNuevo.getFileName());
//        nuevasancion.setArchivo(blob);
        nuevasancion.setContentType(fileNuevo.getContentType());

        UploadedFile file;
        Boolean blGrabarArchivo = true;
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
        Date date = new Date();
        int aleatorio = (int) (Math.random() * 1000 + 1);


        if (fileNuevo != null) {
            STARTPATH = getRuta().get(0).getRuta_final();
//            STARTPATH = "c:/";
//            if (nuevasolicitud.getId() == 0) {
            file = fileNuevo;
//                blGrabarArchivo = true;
//            } else {
//                file = fileEditar;
//                if (fileEditar == null) {
//                    blGrabarArchivo = false;
//                }
//            }

            String path = STARTPATH + "documentosolicitud/";

            //valida extension del archivo        
            String sArchivoExtension;
            sArchivoExtension = getExtension(file.getFileName());
            if (sArchivoExtension.equals("ERROR")) {
                formvalidacion.recordError("El nombre del archivo no puede contener puntos.");
                //envelope.setContents("El nombre del archivo no puede contener puntos.");
                return link;
            } else if (sArchivoExtension.equalsIgnoreCase("pdf") || sArchivoExtension.equalsIgnoreCase("jpg")
                    || sArchivoExtension.equalsIgnoreCase("doc") || sArchivoExtension.equalsIgnoreCase("docx")) {
                //extension valida
            } else {
                formvalidacion.recordError("Solo puede subir archivos con la siguiente extension: .pdf, .jpg, .doc, .docx");
                //envelope.setContents("Solo puede subir archivos con la siguiente extension: .pdf, .jpg, .doc, .docx");
                return link;
            }

            //valida tamanio maximo de carga
            int iTamanioMaximo = 3145728;
            if (file.getSize() > iTamanioMaximo) {
                formvalidacion.recordError("El tamaño maximo de carga del documento es 3MB");
                //envelope.setContents("El tamaño maximo de carga del documento es 3MB");
                return link;
            }

            String[] strings = file.getFileName().split("\\.");
            String nombreArchivos = strings[0].replaceAll(" ", "") + (sdf.format(date) + "-" + aleatorio)
                    + "." + strings[1];

            File nuevo = new File(path + nombreArchivos);
            copied = new File(path);
            if (!copied.exists()) {
                copied.mkdirs();
            }
            file.write(nuevo);
            nuevasancion.setDocumento(path + nombreArchivos);
        }
        session.saveOrUpdate(nuevasancion);
        session.flush();

        return link;
    }

    @Log
    Object onPopupAdjuntaDocumento() {
        return null;
    }
    @Inject
    private PageRenderLinkSource linkSource;
    @Inject
    private PageRenderLinkSource pageRenderLinkSource;

    @Log
    Link onCancelAdjuntaDocumento() {
        Link link = pageRenderLinkSource.createPageRenderLinkWithContext(ABMSancion.class, nuevasancion.getId());
        return link;
    }

    @Log
    public List<ConfiguracionAcceso> getRuta() {
        Criteria c = session.createCriteria(ConfiguracionAcceso.class);
        return c.list();
    }

    @Log
    static public String getExtension(String path) {
        String[] strings = path.split("\\.");
        if (strings.length > 2) {
            return "ERROR";
        } else {
            return strings[strings.length - 1];
        }
    }

    @Log
    StreamResponse onActionFromReturnStreamResponse() {
        return new StreamResponse() {
            InputStream inputStream;
            File fileADescargar = new File(nuevasancion.getDocumento());

            @Override
            public void prepareResponse(Response response) {
                try {
                    inputStream = new FileInputStream(fileADescargar);
                } catch (FileNotFoundException ex) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    response.setContentLength(inputStream.available());
                    response.setHeader("Content-Disposition", "inline;filename=" + fileADescargar.getName());
                } catch (Exception e) {
//                        Logger.getLogger(batch_dev.class.getName()).log(Level.SEVERE, null, e);
                }
            }

            @Override
            public String getContentType() {
                if (extension().toUpperCase().equals("PDF")) {
                    return "application/pdf";
                }
                if (extension().toUpperCase().equals("JPG")) {
                    return "image/jpeg";
                } else {
                    return "application/msword";
                }
            }

            @Override
            public InputStream getStream() throws IOException {
                return inputStream;
            }

            public String extension() {
                int dot = fileADescargar.getName().lastIndexOf(".");
                return fileADescargar.getName().substring(dot + 1);
            }
        };
    }
}
